package com.sh.boot_mq_consumer.test;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @ClassName JmsProduct
 * @Description 连接activemq的队列，消息消费者
 * @Author yaoqiang
 * @Date 2020/10/23 15:26
 * @Version 1.0
 */
public class JmsComsumer {

    public static final String ACTIVEMQ_URL = "tcp://192.168.55.214:61616";
    public static final String Q_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        //1、创建连接工厂，采用默认用户名密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2、通过连接工厂，通过连接工厂获取connect并启动访问
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //3、创建会话session。有两个参数一个是事务，另一个是签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4、创建目的地，具体是队列queue还是主题topic
        Queue queue = session.createQueue(Q_NAME);
        //5、创建消息的消息消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
        //6、通过使用消息消息消费者，发送三条消息
        while (true) {
            // reveive() 一直等待接收消息，在能够接收到消息之前将一直阻塞。 是同步阻塞方式 。和socket的accept方法类似的。
// reveive(Long time) : 等待n毫秒之后还没有收到消息，就是结束阻塞。
            // 因为消息发送者是 TextMessage，所以消息接受者也要是TextMessage
            TextMessage textMessage = (TextMessage) messageConsumer.receive();
            if (textMessage != null) {
                System.out.println(textMessage.getText());
            } else {
                break;
            }

        }
        // 让主线程不要结束。因为一旦主线程结束了，其他的线程（如此处的监听消息的线程）也都会被迫结束。
        // 实际开发中，我们的程序会一直运行，这句代码都会省略。
    //    System.in.read();

        //9、关闭资源
        messageConsumer.close();
        session.close();
        connection.close();
        System.out.println("mq运行结束");

    }
}
